﻿#define _CRT_SECURE_NO_WARNINGS   1
#include<stdio.h>

//移除元素
//给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。
//不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
//元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

//删除所有等于val的值
// 

//思路一：
//遍历 然后判断是不是val 如果是的话 后面整体向前移动
//时间复杂度O(N^2) 空间复杂度O（1）
//思路二：
//创建一个数组 如果不是val就存入新数组 然后再把新数组的拷贝进原来的数组 
//时间复杂度O（N） 空间复杂度O（N）
//思路三：
//双指针 创立dest src 如果src所指的不等于VAL 则放入dest中 再二者++
//int removeElement(int* nums, int numsSize, int val) {
//	int dest = 0;
//	int src = 0;
//	while (src<numsSize)
//	{
//		if (nums[src] != val)
//		{
//			nums[dest] = nums[src];
//			dest++;
//		}
//		src++;
//	}
//	return dest;
//}




//删除有序数组中的重复值
//给你一个 升序排列 的数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。元素的 相对顺序 应该保持 一致
//int removeDuplicates(int* nums, int numsSize) {
//	if (numsSize == 0)
//		return 0;
//	int i = 0;
//	int j = 1;
//	int dest = 0;
//	while (j < numsSize)
//	{
//		if (nums[i] != nums[j])
//		{
//			nums[dest] = nums[i];
//			dest++;
//			i = j;
//		}
//		else
//		j++;
//	}
//	nums[dest] = nums[j];
//	dest++;//表示个数
//	return dest;
//}



//合并两个有序数组
//给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2，另有两个整数 m 和 n ，分别表示 nums1 和 nums2 中的元素数目。
//请你 合并 nums2 到 nums1 中，使合并后的数组同样按 非递减顺序 排列
//void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
//    int dest = m + n - 1;
//    int i = m - 1, j = n - 1;
//    while (j >= 0 && i >= 0)
//    {
//        if (nums1[i] >= nums2[j])
//        {
//            nums1[dest] = nums1[i];
//            i--;
//        }
//        else
//        {
//            nums1[dest] = nums2[j];
//            j--;
//        }
//        dest--;
//    }
//    while (j >= 0)
//    {
//        nums1[dest--] = nums2[j--];
//    }
//}


